﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;
using VNPT.Excel;
using VNPT.Data;
using System.Threading;
using DevExpress.XtraGrid;

namespace VNPT.DoiSoat.DoiSoat
{
    public partial class u106_GTGT_64Tinh : VNPT.Core.uBase
    {
        public u106_GTGT_64Tinh()
        {
            InitializeComponent();

            StyleFormatCondition condition1 = new DevExpress.XtraGrid.StyleFormatCondition();
            condition1.Appearance.BackColor = Color.Red;
            condition1.Appearance.Options.UseBackColor = true;
            condition1.Condition = FormatConditionEnum.Between;
            condition1.Value1 = "1";
            condition1.Value2 = "101";
            condition1.Column = colTiLe_Phut;
            myGridView1.FormatConditions.Add(condition1);

            StyleFormatCondition condition2 = new DevExpress.XtraGrid.StyleFormatCondition();
            condition2.Appearance.BackColor = Color.Red;
            condition2.Appearance.Options.UseBackColor = true;
            condition2.Condition = FormatConditionEnum.Between;
            condition2.Value1 = "1";
            condition2.Value2 = "101";
            condition2.Column = colTiLe_Cuoc;
            myGridView1.FormatConditions.Add(condition2);
            
            // Phần
            StyleFormatCondition condition11 = new DevExpress.XtraGrid.StyleFormatCondition();
            condition11.Appearance.BackColor = Color.Red;
            condition11.Appearance.Options.UseBackColor = true;
            condition11.Condition = FormatConditionEnum.Between;
            condition11.Value1 = "1";
            condition11.Value2 = "101";
            condition11.Column = gridColumn10;
            myGridView2.FormatConditions.Add(condition11);

            StyleFormatCondition condition21 = new DevExpress.XtraGrid.StyleFormatCondition();
            condition21.Appearance.BackColor = Color.Red;
            condition21.Appearance.Options.UseBackColor = true;
            condition21.Condition = FormatConditionEnum.Between;
            condition21.Value1 = "1";
            condition21.Value2 = "101";
            condition21.Column = gridColumn11;
            myGridView2.FormatConditions.Add(condition21);
            myGridView1.OptionsView.WaitAnimationOptions = DevExpress.XtraEditors.WaitAnimationOptions.Panel;
            myGridView2.OptionsView.WaitAnimationOptions = DevExpress.XtraEditors.WaitAnimationOptions.Panel;
            myGridView3.OptionsView.WaitAnimationOptions = DevExpress.XtraEditors.WaitAnimationOptions.Panel;


        }
       
        public override void SaveSetting()
        {
            base.SaveSetting();
        }

        public override void LoadSetting()
        {
            try
            {
                list_Goi_Den.Clear();
                list_Goi_Di.Clear();
                LoadTemplateData_GoiDi();
                LoadTemplateData_GoiDen();
            }
            catch (Exception)
            {
                DevExpress.XtraEditors.XtraMessageBox.Show("Không lấy được danh sách dịch vụ của từng VTT/TP từ file Excel!", "Thông báo!", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
            mySQLEditor1.Text = DoiSoatSetting.SQL_GTGT_VINAPHONE_GOI_DEN_DLK;
            base.LoadSetting();
        }
       
        private void btnLoad_Click(object sender, EventArgs e)
        {

            myGridView1.ShowLoadingPanel();
            myGridView2.ShowLoadingPanel();
            myGridView3.ShowLoadingPanel();

            LoadDataFrom_Server();
     
            if (DbServer.Conn.State == ConnectionState.Closed)
            {
                DbServer.Open();
            }

            _is_stoped = false;
            num_threads = (int)mySpinEdit1.Value;
            int minWorker, minIOC;

            ThreadPool.GetMinThreads(out minWorker, out minIOC);
            ThreadPool.SetMaxThreads(num_threads, num_threads + 10);

            int dem = 0;
            foreach (var s in list_Goi_Di)
            {
                ThreadPool.QueueUserWorkItem(new WaitCallback(DoWorkMultiThread), (object)dem);
                dem++;
            }
        }

        void LoadDataFrom_Server()
        {
            using (new DevExpress.Utils.WaitDialogForm("Đang lấy dữ liệu, vui lòng chờ..."))
            {

                list_Goi_Den.ForEach(e =>
                {
                    e.Cuoc_DLK = 0;
                    e.Phut_DLK = 0;
                });

                DataTable dt = new DataTable();
                var sql = string.Format(DoiSoatSetting.SQL_GTGT_GOI_DEN_DLK, DoiSoatSetting.NAM, DoiSoatSetting.THANG);
                dt = DbServer.GetDataTable(new QueryCommandConfig(sql));
                if (dt.Rows.Count >= 1)
                {
                    foreach (var item in dt.Rows)
                    {
                        var row = (DataRow)item;
                        var ma_mang = (row["MA_MANG"] ?? "").ToString();
                        int ot = 0;

                        var _phut = (row["PHUT"] ?? "0").ToString();
                        int.TryParse(_phut, out ot);
                        var Phut = ot;

                        var _cuoc = (row["CUOC"] ?? "0").ToString();
                        int.TryParse(_phut, out ot);
                        var Cuoc = ot;

                        var pt = list_Goi_Den.Where(p => p.MaMang == ma_mang || p.MaMang + "GPH" == ma_mang);
                        if (pt.Any())
                        {
                            var obj = pt.First();
                            obj.Phut_DLK += Phut;
                            obj.Cuoc_DLK += Cuoc;
                        }
                    }
                }
            }
        }

        List<GTGT> list_Goi_Di = new List<GTGT>();
       
        private void LoadTemplateData_GoiDi()
        {
            list_Goi_Di.Clear();
            var path = Application.StartupPath + "\\DoiSoat\\Ma64Tinh.xls";
            var dt = GetData(path, 1);
            foreach (var item in dt.Rows)
            {
                var dr = (DataRow)item;
                list_Goi_Di.Add(new GTGT()
                {
                    MaMang = dr["MA_MANG"].ToString(),
                    TenTinh = dr["TEN"].ToString(),
                    DichVu = "DV108x",
                    MaVung = dr["Ma_Vung"].ToString(),
                    Query = string.Format(DoiSoatSetting.SQL_GTGT_GOI_DI_108x, DoiSoatSetting.NAM,DoiSoatSetting.THANG,dr["MA_VUNG"].ToString())
                });
                list_Goi_Di.Add(new GTGT()
                {
                    MaMang = dr["MA_MANG"].ToString(),
                    TenTinh = dr["TEN"].ToString(),
                    DichVu = "DV801x",
                    MaVung = dr["Ma_Vung"].ToString(),
                    Query = string.Format(DoiSoatSetting.SQL_GTGT_GOI_DI_801x, DoiSoatSetting.NAM, DoiSoatSetting.THANG, dr["MA_VUNG"].ToString())
                });
                list_Goi_Di.Add(new GTGT()
                {
                    MaMang = dr["MA_MANG"].ToString(),
                    TenTinh = dr["TEN"].ToString(),
                    DichVu = "DV802x",
                    MaVung = dr["Ma_Vung"].ToString(),
                    Query = string.Format(DoiSoatSetting.SQL_GTGT_GOI_DI_802x, DoiSoatSetting.NAM, DoiSoatSetting.THANG, dr["MA_VUNG"].ToString())
                });

                list_Goi_Di.Add(new GTGT()
                {
                    MaMang = dr["MA_MANG"].ToString(),
                    TenTinh = dr["TEN"].ToString(),
                    DichVu = "DV1089",
                    MaVung = dr["Ma_Vung"].ToString(),
                    Query = string.Format(DoiSoatSetting.SQL_GTGT_GOI_DI_1089x, DoiSoatSetting.NAM, DoiSoatSetting.THANG, dr["MA_VUNG"].ToString())
                });
            }
            gTGTBindingSource_Di.DataSource = list_Goi_Di;
        }
       
        List<GTGT> list_Goi_Den = new List<GTGT>();
       
        private void LoadTemplateData_GoiDen()
        {
            list_Goi_Den.Clear();
            var path = Application.StartupPath + "\\DoiSoat\\Ma64Tinh.xls";
            var dt = GetData(path, 1);
            foreach (var item in dt.Rows)
            {
                var dr = (DataRow)item;
                list_Goi_Den.Add(new GTGT()
                {
                    MaMang = dr["MA_MANG"].ToString(),
                    TenTinh = dr["TEN"].ToString(),
                   // DichVu = "DV108x",
                    MaVung = dr["Ma_Vung"].ToString()
                });
                //list_Goi_Den.Add(new GTGT()
                //{
                //    MaMang = dr["MA_MANG"].ToString(),
                //    TenTinh = dr["TEN"].ToString(),
                //    DichVu = "DV801x",
                //    MaVung = dr["Ma_Vung"].ToString()
                //});
                //list_Goi_Den.Add(new GTGT()
                //{
                //    MaMang = dr["MA_MANG"].ToString(),
                //    TenTinh = dr["TEN"].ToString(),
                //    DichVu = "DV802x",
                //    MaVung = dr["Ma_Vung"].ToString()
                //});
                //list_Goi_Den.Add(new GTGT()
                //{
                //    MaMang = dr["MA_MANG"].ToString(),
                //    TenTinh = dr["TEN"].ToString(),
                //    DichVu = "DV1089x",
                //    MaVung = dr["Ma_Vung"].ToString()
                //});
            }
            gTGTBindingSource_Den.DataSource = list_Goi_Den;
        }

        private bool _is_stoped;
        
        private int num_threads;

        private void DoWorkMultiThread(object obj)
        {
            if (_is_stoped)
            {
                myGridView1.HideLoadingPanel();
                myGridView2.HideLoadingPanel();
                myGridView3.HideLoadingPanel();
                return;
            }

            try
            {
                if (DbServer.Conn.State == ConnectionState.Closed)
                {
                    DbServer.Open();
                }
                int phut = 0;
                int cuoc = 0;
                int index = (int)obj;
                list_Goi_Di[index].TrangThai = "Wait...";
                var cmd = new QueryCommandConfig(list_Goi_Di[index].Query);

                DataTable t = DbServer.GetDataTable(cmd);

                var _phut = t.Rows[0]["Phut"];
                var _cuoc = t.Rows[0]["Cuoc"];

                int.TryParse((_phut ?? "0").ToString(), out phut);
                int.TryParse((_cuoc ?? "0").ToString(), out cuoc);

                list_Goi_Di[index].Phut_DLK = phut;
                list_Goi_Di[index].Cuoc_DLK = cuoc;


                list_Goi_Di[index].TrangThai = "Ok";
                UpdateGridControl(index);
                // if (!li.Any(p => p.TrangThai != "Ok"))
                if (index == list_Goi_Di.Count - 1)
                {
                    //LoadDataFrom_Server();
                    myGridView1.HideLoadingPanel();
                    myGridView2.HideLoadingPanel();
                    myGridView3.HideLoadingPanel();
                    DevExpress.XtraEditors.XtraMessageBox.Show("Đã tính toán xong, vui lòng xin kiểm tra lại!", "Thông báo!", MessageBoxButtons.OK, MessageBoxIcon.Information);

                    float di = (float)list_Goi_Di.Sum(p => p.Phut);
                    float di_dlk = (float)list_Goi_Di.Sum(p => p.Phut_DLK);

                    float tlDi = (di > di_dlk ? (di - di_dlk) / di : (di_dlk - di) / di_dlk)*100;

                    lblChieuDi.Text = string.Format("Chiều đi: {0:n2}%", tlDi);

                    float den = (float)list_Goi_Den.Sum(p => p.Phut);
                    float den_dlk = (float)list_Goi_Den.Sum(p => p.Phut_DLK);

                    float tlDen = (den > den_dlk ? (den - den_dlk) / den : (den_dlk - den) / den_dlk) * 100;
                    lblChieuDen.Text = string.Format("Chiều đến: {0:n2}%",tlDen);
                }
            }
            catch (Exception)
            {
                
            }
            
           
        }

        private void UpdateGridControl(int index)
        {
            this.myGridControl1.BeginInvoke
            (
                new MethodInvoker
                (
                    delegate
                    {
                        myGridControl1.RefreshDataSource();
                        myGridControl1.Refresh();
                        this.myGridView1.MakeRowVisible(index, true);
                    }
                )
            );
        }

        private DataTable GetData(string Path, int index)
        {
            if (System.IO.File.Exists(Path))
            {
                FileStream stream = File.Open(Path, FileMode.Open);//, FileMode.Open, FileAccess.Read);
                IExcelDataReader excelReader;
                if (Path.EndsWith(".xls"))
                {
                    excelReader = ExcelReaderFactory.CreateBinaryReader(stream);
                }
                else
                {
                    if (Path.EndsWith(".xlsx"))
                    {
                        excelReader = ExcelReaderFactory.CreateOpenXmlReader(stream);
                    }
                    else
                    {
                        DevExpress.XtraEditors.XtraMessageBox.Show("File không hợp lệ!");
                        return null;
                    }
                }

                excelReader.IsFirstRowAsColumnNames = true;
                DataSet result = excelReader.AsDataSet();

                return result.Tables[index];
            }
            return null;
        }
       
        private DataTable GetData(string Path, string TableName)
        {
            if (System.IO.File.Exists(Path))
            {
                FileStream stream = File.Open(Path, FileMode.Open);//, FileMode.Open, FileAccess.Read);
                IExcelDataReader excelReader;
                if (Path.EndsWith(".xls"))
                {
                    excelReader = ExcelReaderFactory.CreateBinaryReader(stream);
                }
                else
                {
                    if (Path.EndsWith(".xlsx"))
                    {
                        excelReader = ExcelReaderFactory.CreateOpenXmlReader(stream);
                    }
                    else
                    {
                        DevExpress.XtraEditors.XtraMessageBox.Show("File không hợp lệ!");
                        return null;
                    }
                }

                excelReader.IsFirstRowAsColumnNames = true;
                DataSet result = excelReader.AsDataSet();

                return result.Tables[TableName];
            }
            return null;
        }

        public void SetBindingSourceDataSource(object newDataSource)
        {
            if (InvokeRequired)
                Invoke(new Action<object>(SetBindingSourceDataSource), newDataSource);
            else
                this.myGridControl1.DataSource = newDataSource;
        }

        private void btnExport_Click(object sender, EventArgs e)
        {
            if (xtraTabControl1.SelectedTabPage == xtraTabPage1)
            {
                new VNPT.Utility.Grid.GridExport().Export(myGridControl1);
            }
            if (xtraTabControl1.SelectedTabPage == xtraTabPage2)
            {
                new VNPT.Utility.Grid.GridExport().Export(myGridControl2);
            }
            if (xtraTabControl1.SelectedTabPage == xtraTabPage3)
            {
                new VNPT.Utility.Grid.GridExport().Export(myGridControl3);
            }
        }

        private void btnDung_Click(object sender, EventArgs e)
        {
            if (DevExpress.XtraEditors.XtraMessageBox.Show("Bạn có chắc muốn dừng không?", "Xác nhận?", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
            {
                _is_stoped = true;
            }
        }
       
        private void btnImport_Click(object sender, EventArgs e)
        {
            Import_ChieuDi();
            Import_ChieuDen();
        }

        private void Import_ChieuDi()
        {
            //Lưu ý khi lấy giá trị từ file excel thì chỉ cần xóa tổng phía dưới, KHÔNG cần cộng tổng lại, chương trình sẽ tự cộng
            if (this.lookUpEdit1.EditValue != null)
            {
                var n = GetData(btnPath.EditValue.ToString(), this.lookUpEdit1.EditValue.ToString());
                List<GTGT> gt = new List<GTGT>();

                //Chuyển dữ liệu lấy từ Excel (DataTable) sang list của class GTGT
                foreach (var item in n.Rows)
                {
                    var dr = (DataRow)item;

                    var Ten = (dr["TENTINH"] ?? "").ToString();
                    var d_vu = (dr["DICH_VU"] ?? "").ToString();
                    var phut = (dr["PHUT"] ?? "").ToString();
                    var cuoc = (dr["CUOC"] ?? "").ToString();

                    int so_Phut = 0;
                    int so_Cuoc = 0;

                    int.TryParse(phut, out so_Phut);
                    int.TryParse(cuoc, out so_Cuoc);

                    gt.Add(new GTGT()
                    {
                        TenTinh = Ten,
                        DichVu = d_vu,
                        Phut = so_Phut,
                        Cuoc = so_Cuoc
                    });
                }

                //Nhóm dịch vụ và tỉnh Thành
                var kq = from p in gt
                         group p by new { p.Nhom, p.TenTinh } into g
                         select new GTGT()
                         {
                             Cuoc = g.Sum(p => p.Cuoc),
                             Phut = g.Sum(p => p.Phut),
                             DichVu = g.First().DichVu,
                             TenTinh = g.First().TenTinh,
                         };

                // Sau khi cộng xong thì mới đưa vào.
                foreach (var item in kq)
                {
                    var pt = list_Goi_Di.Where(p => p.Nhom == item.Nhom && p.TenTinh == item.TenTinh);
                    if (pt.Any())
                    {
                        var obj = pt.First();
                        obj.Phut = item.Phut;
                        obj.Cuoc = item.Cuoc;
                    }
                }

                gTGTBindingSource_Di.DataSource = list_Goi_Di;
                myGridControl1.RefreshDataSource();
                myGridControl1.Refresh();
            }
            else
            {
                MessageBox.Show("Chưa chọn SheetName cho chiều đi!");
            }
        }
        
        private void Import_ChieuDen()
        {
            if (this.lookUpEdit2.EditValue != null)
            {
                var n = GetData(btnPath.EditValue.ToString(), this.lookUpEdit2.EditValue.ToString());
                List<GTGT> gt = new List<GTGT>();

                foreach (var item in n.Rows)
                {
                    var dr = (DataRow)item;

                    var Ten = (dr["TENTINH"] ?? "").ToString();
                    var d_vu = (dr["DICH_VU"] ?? "").ToString();
                    var phut = (dr["PHUT"] ?? "").ToString();
                    var cuoc = (dr["CUOC"] ?? "").ToString();

                    int so_Phut = 0;
                    int so_Cuoc = 0;

                    int.TryParse(phut, out so_Phut);
                    int.TryParse(cuoc, out so_Cuoc);

                    gt.Add(new GTGT()
                    {
                        TenTinh = Ten,
                        DichVu = d_vu,
                        Phut = so_Phut,
                        Cuoc = so_Cuoc
                    });
                }

                //Nhóm danh sách lại theo tỉnh
                var kq = from p in gt
                         group p by new {p.TenTinh } into g
                         select new GTGT()
                         {
                             Cuoc = g.Sum(p => p.Cuoc),
                             Phut = g.Sum(p => p.Phut),
                             DichVu = g.First().DichVu,
                             TenTinh = g.First().TenTinh,
                         };

                foreach (var item in kq)
                {
                    var pt = list_Goi_Den.Where(p => p.TenTinh.ToUpper() == item.TenTinh.ToUpper());
                    if (pt.Any())
                    {
                        var obj = pt.First();
                        obj.Phut = item.Phut;
                        obj.Cuoc = item.Cuoc;
                    }
                }
                gTGTBindingSource_Den.DataSource = list_Goi_Den;
                myGridControl2.RefreshDataSource();
                myGridControl2.Refresh();
            }
            else
            {
                MessageBox.Show("Chưa chọn SheetName!");
            }
        }
       
        private void btnPath_EditValueChanged(object sender, EventArgs e)
        {
            lookUpEdit1.Properties.DataSource = lookUpEdit2.Properties.DataSource = GetSheetName(btnPath.Text);
        }

        private List<string> GetSheetName(string Path)
        {
            List<string> kq = new List<string>();
            if (System.IO.File.Exists(Path))
            {
                FileStream stream = File.Open(Path, FileMode.Open);//, FileMode.Open, FileAccess.Read);
                IExcelDataReader excelReader;
                if (Path.EndsWith(".xls"))
                {
                    excelReader = ExcelReaderFactory.CreateBinaryReader(stream);
                }
                else
                {
                    if (Path.EndsWith(".xlsx"))
                    {
                        excelReader = ExcelReaderFactory.CreateOpenXmlReader(stream);
                    }
                    else
                    {
                        DevExpress.XtraEditors.XtraMessageBox.Show("File không hợp lệ!");
                        return null;
                    }
                }

                excelReader.IsFirstRowAsColumnNames = true;
                DataSet result = excelReader.AsDataSet();

                foreach (var item in result.Tables)
                {
                    kq.Add(((DataTable)item).TableName);
                }
                return kq;
            }
            return null;
        }
        
        private void barDV108x_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
        {
            new fEditSQL("SQL_GTGT_GOI_DI_108x",
                "Lấy phút và cuộc DakLak gọi vào dịch vụ 108x các VTT/TP",
                "Trả về PHUT và CUOC. Các tham số {0}= Năm, {1:D2}= Tháng, {2}= Mã vùng tương ứng của VTT/TP").ShowDialog();
        }

        private void barDV801x_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
        {
            new fEditSQL("SQL_GTGT_GOI_DI_801x",
                "Lấy phút và cuộc DakLak gọi vào dịch vụ 801x các VTT/TP",
                "Trả về PHUT và CUOC. Các tham số {0}= Năm, {1:D2}= Tháng, {2}= Mã vùng tương ứng của VTT/TP").ShowDialog();
        }

        private void barDV802x_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
        {
            new fEditSQL("SQL_GTGT_GOI_DI_802x",
                "Lấy phút và cuộc DakLak gọi vào dịch vụ 802x các VTT/TP",
                "Trả về PHUT và CUOC. Các tham số {0}= Năm, {1:D2}= Tháng, {2}= Mã vùng tương ứng của VTT/TP").ShowDialog();
        }

        private void barDV1089_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
        {
            new fEditSQL("SQL_GTGT_GOI_DI_1089x",
                "Lấy phút và cuộc DakLak gọi vào dịch vụ 1089 các VTT/TP",
                "Trả về PHUT và CUOC. Các tham số {0}= Năm, {1:D2}= Tháng, {2}= Mã vùng tương ứng của VTT/TP").ShowDialog();
        }
        
        private void barDenAllDichVu_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
        {
            new fEditSQL("SQL_GTGT_GOI_DEN_DLK",
                "Lấy phút và cuộc gọi các VTT/TP đến các dịch vụ 108x, 801x, 802x, 1089 của DakLak",
                "Trả về MA_MANG, PHUT, CUOC. Các tham số {0}= Năm, {1:D2}= Tháng").ShowDialog();
        }

        private void btnRun_Click(object sender, EventArgs e)
        {
            using (new DevExpress.Utils.WaitDialogForm("Đang tải dữ liệu, vui lòng chờ..."))
            {
                var sql = string.Format(mySQLEditor1.Text, DoiSoatSetting.NAM, DoiSoatSetting.THANG);
                myGridControl3.DataSource = DbServer.GetDataTable(new QueryCommandConfig(sql));
            }
        }

        private void btnSave_Click(object sender, EventArgs e)
        {
            DoiSoatSetting.SQL_GTGT_VINAPHONE_GOI_DEN_DLK = mySQLEditor1.Text;
        }

        private void btnXuat_Click(object sender, EventArgs e)
        {

        }
    }
}
